【新機能】 Amazon API Gateway が Canary Release Deployments (新しいバージョンへの部分的な振り分け) に対応しました #reinvent
2017年11月28日、 API Gateway に新しい機能が追加されました。Canary Release Deployments です。つまり、一部の先行ユーザーにだけ、新しいAPIへ振り分ける機能、ということになります。東京リージョンで利用可能です。
さっそく試してみましょう。まずは画面から見ていきます。
Canary 設定をみる
まずは設定項目を眺めてみることにします。APIを用意しましょう。API を定義してデプロイし、「ステージ」メニューへ行きます。そこで、「Canary」タブが追加されていることが確認できると思います。
Create Canary ボタンを押してみましょう。入力項目が展開されます。
項目と説明を見る限り、以下の内容が設定できそうです。
Stage's Request Distribution
現行版と、新しいAPIの重み付けを行います。合計100%になるように、二者間でパーセンテージを調整できます。
Canary Deployment
現行バージョンの情報が記載されているようです。
Canary State Variables
現行バージョンのステージ変数に対して上書き・追加ができます。新しいバージョンでステージ変数を変えたい場合などに有用です。
Canary 設定を入力する
今回実際に試すAPIは、以下のように、APIがコールされたら DynamoDB へ Query を発行し、結果をクライアントに返す構成とします。
この構成は以下の記事で実装したものです。
そして、現行バージョンと Canary バージョンには以下のような違いを持たせています:
- 現行: DynamoDB Query で 候補者ID のみ指定する
- Canary: DynamoDB Query で 候補者IDと投票日 を指定する
次の図はリクエストマッピングテンプレートで見たときに追加した部分です:
リクエストパスは次です:
- /candidates/MI12341011/votes?date=2017-11-11T22:00:12+09:00
DynamoDB には次のようなデータを保存しています:
候補者ID (パーティションキー) | 投票受付日 (ソートキー) | 投票ポイント | 現行版で返る | Canary版で返る |
---|---|---|---|---|
MI12341011 | 2017-11-10T12:00:12+09:00 | 345.11 | ◯ | |
MI12341011 | 2017-11-11T22:00:12+09:00 | 102.34 | ◯ | ◯ |
MI12341011 | 2017-11-12T09:12:45+09:00 | 344.11 | ◯ | |
SU40120055 | 2017-11-10T12:14:44+09:00 | 345.11 |
以上より、リクエストに対して、複数の結果が返ってきたら現行バージョン が、 ソートキーも指定することでひとつだけ結果が返ってきたら Canary バージョン がコールされたことになります。では、Canary バージョンをデプロイしましょう。
Canary デプロイ
実は先程、設定内容を見るために「Canaryを作成」した段階で Canary 機能が有効になっています。有効になっている状態で、いつもどおり API をデプロイしようとすると、
ステージ名に「Canary が有効」とつきます。まずはここにデプロイしてOKです。Canaryの重みは現在0%にしているので、新しいAPIにリクエストが割り振られることはありません。デプロイしたら、リクエストを投げてみます。
何度リクエストを送っても、複数の結果が返ってきます。すなわちソートキー指定機能が入っておらず、パーティションキーのみで Query が走っているからだ、とわかります。では、重みを変更してみましょう。
何度かリクエストを送ってみます…
要素数1のレスポンスが返ってきました。これは、新しいバージョンのAPIが適用されており、クエリパラメータが展開され DynamoDB Query のソートキーに指定されているからだ、ということが言えます。繰り返し試しましたが、たしかに体感重みづけた割合の通りの振り分け率になっていそうです。ステージ v1
には、現行バージョンと Canary バージョンが同時に存在していることがわかりました。
Canary バージョンに問題がなさそうだとわかったので、昇格させましょう。
実行すると、Canary: 100%, v1: 0% となりました。すべてのリクエストが Canary へ振り分けられることになります。
CloudWatch メトリクスでも 区別できる
CloudWatch も見ておきましょう。Canary にリクエストが振り分けられた場合、以下のようなステージ名になり、メトリクスを現行バージョンと明確に区別することが可能です。新しく振り分けた Canary でエラーが発生していないかどうか確認できるので、とても便利ですね!
まとめ
API Gateway に新しく追加された Canary Release Deployments を試しました。これまでは、本番ステージへ適用する前にテストステージなどで十分に確認したあと、100%置き換えることしかできませんでした。 Canary がサポートされたことによって一部のリクエストのみ振り分けられるようになった上、その結果を CloudWatch で確認することが可能になりました。A/B テストができるようになりましたので、素早いデプロイと効果測定が必要になるモバイル領域で活躍してくれそうですね。